from django.shortcuts import render
from django.views import View
from django import http
from alipay import AliPay
from django.conf import settings
import os

from meiduo_mall.utils.views import LoginRequiredJSONMixin
from orders.models import OrderInfo
from meiduo_mall.utils.response_code import RETCODE
from payment.models import Payment
# Create your views here.


class PaymentStatusView(View):
    """支付宝支付的回调"""

    def get(self, request):
        """处理支付宝支付的回调逻辑"""
        # 接收所有的查询字符串参数:GET返回的是QueryDict类型的对象
        query_dict = request.GET

        # 将查询字符串参数转成字典
        data = query_dict.dict()

        # 在移除并提取查询字符串参数中的sign
        signature = data.pop("sign")

        # 初始化对接支付宝的SDK实例
        alipay = AliPay(
            appid=settings.ALIPAY_APPID,  # 应用ID
            app_notify_url=None,  # 默认回调url
            # 应用的私钥和支付宝公钥路径（注意点：可以直接传入公私钥的内容app_private_key_string alipay_public_key_string）
            app_private_key_path=os.path.join(os.path.dirname(os.path.abspath(__file__)), "keys/app_private_key.pem"),
            alipay_public_key_path=os.path.join(os.path.dirname(os.path.abspath(__file__)),
                                                "keys/alipay_public_key.pem"),
            sign_type="RSA2",  # 签名的标准
            debug=settings.ALIPAY_DEBUG  # 表示当前是调试环境
        )

        # 使用SDK实例调用verify方法来验证sign
        success = alipay.verify(data, signature)

        # 如果验证通过，说明这个回调是支付宝在支付成功后的回调请求
        if success:
            # 将美多商城维护的订单和支付宝维护的订单做关联
            order_id = data.get('out_trade_no') # 获取美多商城维护的订单编号
            trade_id = data.get('trade_no') # 获取支付宝维护的订单编号

            Payment.objects.create(
                order_id = order_id,
                trade_id = trade_id
            )

            # 修改订单的状态（由待支付修改为待评价）
            OrderInfo.objects.filter(order_id=order_id, status=OrderInfo.ORDER_STATUS_ENUM['UNPAID']).update(
                status=OrderInfo.ORDER_STATUS_ENUM["UNCOMMENT"])

            # 响应trade_id
            context = {
                'trade_id': trade_id
            }

            # 跳转到支付成功页面
            return render(request, 'pay_success.html', context)
        else:
            return http.HttpResponseBadRequest('非法请求')


class PaymentView(LoginRequiredJSONMixin, View):
    """对接支付宝支付"""

    def get(self, request, order_id):
        """实现对接支付宝支付逻辑"""
        # 校验参数
        user = request.user
        try:
            order = OrderInfo.objects.get(order_id=order_id, user=user, status=OrderInfo.ORDER_STATUS_ENUM['UNPAID'])
        except OrderInfo.DoesNotExist:
            return http.HttpResponseForbidden('订单不存在')

        # 使用python-alipay-sdk对接支付宝的支付接口、功能
        # 初始化对接支付宝的SDK实例
        alipay = AliPay(
            appid=settings.ALIPAY_APPID, # 应用ID
            app_notify_url=None,  # 默认回调url
            # 应用的私钥和支付宝公钥路径（注意点：可以直接传入公私钥的内容app_private_key_string alipay_public_key_string）
            app_private_key_path=os.path.join(os.path.dirname(os.path.abspath(__file__)), "keys/app_private_key.pem"),
            alipay_public_key_path=os.path.join(os.path.dirname(os.path.abspath(__file__)),
                                                "keys/alipay_public_key.pem"),
            sign_type="RSA2", # 签名的标准
            debug=settings.ALIPAY_DEBUG # 表示当前是调试环境
        )

        # 使用SDK实例对接电脑网站支付 alipay.trade.page.pay
        order_string = alipay.api_alipay_trade_page_pay(
            out_trade_no=order_id, # 美多商城维护的订单编号
            total_amount=str(order.total_amount), # 支付金额
            subject="美多商城%s" % order_id, # 订单的标题
            return_url=settings.ALIPAY_RETURN_URL # 同步回调的地址（用来等待支付结果的）
        )

        # 拼接电脑网站支付收银台登录页面的地址，正式环境，需要跳转到https://openapi.alipay.com/gateway.do? + order_string
        # 拼接电脑网站支付收银台登录页面的地址，开发环境，需要跳转到https://openapi.alipaydev.com/gateway.do? + order_string
        alipay_url = settings.ALIPAY_URL + '?' + order_string

        return http.JsonResponse({'code': RETCODE.OK, 'errmsg': 'OK', 'alipay_url': alipay_url})